package org.nutz.dao.impl.link;

import org.nutz.dao.entity.LinkField;
import org.nutz.dao.impl.AbstractLinkVisitor;
import org.nutz.dao.impl.entity.field.ManyManyLinkField;
import org.nutz.dao.sql.Pojo;
import org.nutz.dao.util.Pojos;
import org.nutz.lang.Each;
import org.nutz.lang.ExitLoop;
import org.nutz.lang.Lang;
import org.nutz.lang.LoopException;

/**
 * 在中间表中，清除关于所有的链接对象的映射。
 * <p>
 * 即，如果 A-X, B-X， 因为链接对象是 X，它会将这两个关系都清除
 * 
 * @author zozoh(zozohtnt@gmail.com)
 */
public class DoClearRelationByLinkedFieldLinkVisitor extends AbstractLinkVisitor {

	public void visit(Object obj, LinkField lnk) {
		if (lnk instanceof ManyManyLinkField) {
			final ManyManyLinkField mm = (ManyManyLinkField) lnk;
			Object value = mm.getValue(obj);
			if (Lang.length(value) == 0)
				return;

			final Pojo pojo = opt.maker().makeDelete(mm.getRelationName());
			pojo.append(Pojos.Items.cndColumn(mm.getToColumnName(), mm.getLinkedField(), null));

			Lang.each(value, new Each<Object>() {
				public void invoke(int i, Object ele, int length) throws ExitLoop, LoopException {
					pojo.addParamsBy(mm.getLinkedField().getValue(ele));
				}
			});

			opt.add(pojo);
		}
	}

}
